Overview
As of September 2026, 4 characters have been developed to work with GiobGeab, of which 2 have entered production. This DOC will give details on these characters and how they can be developed.
Lion
The lion character is one of the two characters entered into production in Meall an Óige. This character was made by purchasing a unrigged mesh on cgtrader from this link, then adding shape keys to the character in Blender using an armature and scultping. The model currently has shape keys for 14 of the possible 21 visemes the GiobGeab api produces. It doesnt have [S, KG_S, KG_B, LSL, LBL, NSL, VBCU]. It is recommnded to use [TD_S, TD_S, TD_B, NBL, NBL, NBL, VFC] respectively for the missing visemes.
Developing Lion Character
To make changes to this character, it is recommended to download the nescessary files from cloud storage, make changes, test extensively, then upload new copy back to the drive. The Lion folder containing the lion.blend file can be downloaded from this link. This character is not too challenging to work with (especially considering the Spring Character).
The method I used to develop shape keys can be seen below:
- Going into pose mode and manipulating the bones to create the desired face shape
- Then going back into object mode and going to the 'Modifiers' menu
- Navigate to Armature, click 'Save as Shape Key' or 'Apply as Shape Key'*.
- Rename the shape key from the default name to the desired viseme name or pose. If creating a viseme try keep the naming convention used in GiobGeab Viseme Set
- Go back to pose mode and reset all deformations by selecing all bones then clicking alt+g, alt+s, alt+r
- To fine tune shape keys, you can click a shape key from the menu, then go into edit mode. This allows you to perform scultping or other editing on that specific shape key. This can help clean up jagged topology or make changes the armature cannot do alone. It is possible to make a shape key like this without touching the armature at all. If that's your strength, power to you!
As an aid to help make broad visemes, I added a shape key called something like "viseme_broadener". I would then toggle with both the slender shape key of a letter and viseme_broadener to create a more rounded viseme for that letter, and saving shape key as a 'mix'.
The textures of this character are contained in a single png file. This can be edited however you wish. I used Blender's inbuilt utilities like texture paint, uv editor and shaders. The character has a mane, which can be removed by hovering over the mane with mouse, clicking 'l', then delete. This makes it anatomically female but makes it look a lot less like a lion.
The maker of the original Lion mesh has a variety of different characters with very similar (if not exactly the same base shapes) as the lion available here The development of these characters would be pretty straightforward with all the same steps as the lion. Could be possible to copy the armature and shape keys directly, but i'm not sure.
Export settings:
Spring
Spring is a character built by Blender Studios for their own production, "Spring". The complexity of this model is much much much higher than the Lion character. The base mesh was downloaded from Blender Studio, then significant changes were made to make it suitable for lightweght automated use. These changes included :
- Deleting non-necessary high triangle count meshes like stitching and buttons
- Reducing pixel count of textures
- Baking shaders into 1-3 images per mesh (diffuse, roughness and normal), with most meshes only having the diffuse image.
- Deleting of all in built shape keys and driven shape keys
- Baking shape keys for 20 of the 21 GiobGeab visemes (missing only VBCU) and many action shape keys
Developing Spring Character
The Spring character was built in Blender 2.8 using BlenRig 5. You can thus maintain this character by downloading blender 2.8 and blenrig 5, or as I did use a more modern Blender version with BlenRig 6. Making Shape Keys with this model is quite complicated fir a couple of different reasons.
- There are many different meshes affected by the rig, so making a shape key for something like a head nod means adding a shape key to all the hair meshes, they eyes, the irises, face, eyebrows and more. The method used in the Lion character would take a massive amount of time for this character
- BlenRig isnt as straight forward as the built in Blender Armature, its deformations aren't as easily reset after baking as the armatures literal rest position isnt what we want the default position to be.
- Some meshes use a combination of MeshDeform as well as ArmatureDeform, which isnt particurly clean for shape key generation
To get around these issues I developed an alternative workflow with some automated scripts.
Before beginning note that once you run the scripts the mesh becomes unusable for further changes, so the only thing you can do after running the scripts is exporting the character as a GLB. For this reason is it recommended to work on full copy of the folder, then make another copy between steps 4 and 5.
- Go to the Asset library and apply the Basis pose. This will remove any leftover deformations and put the character in its resting position.
- Use pose mode to manipulate the character into the desired position. You should use only pose mode, never sculpting or any other edit mode feature
- Select all bones, then add the position as a Pose Asset through the Action Editer in the Dope Sheet. There are two catelogs of Pose assets, one for Visemes and one for Actions. The catelogs are only for organisational purposes and disapper on export.
- Go to Asset Library, apply the Basis position, then try applying your new Pose Asset and see if it works as intended. If not you may have to delete it from either the Asset Library or the Dope Sheet and try again.
At this point you should save and create a copy of the entire folder you have been working in. If the testing is succesful this copy will become the new basis for further development
- Once all the pose assets are in order, its time to bake the shape keys. The scripts automate the baking of shape keys for all but two meshes which you must do yourself.
- FIrst manually bake the arms, pullover and jacket.
- Do this by applying the basis pose, then applying a pose that affects any of these meshes
- Click the mesh, go to modifiers, and click 'Save as Shape Key' or 'Apply as Shape Key'* for MeshDeform and Armature. If the mesh has only has one all you have to do is rename the new shape key appropriately. IF it has both MeshDeform and Armature then you need to save both as seperate shape keys, then toggle them both on, create new shape key by saving as a mix, then deleting the two original ones.
- Second, bake the other Poses using the bake_actions_to_shape_keys.py and replace_default_basis.py scripts from this folder.
- Copy the bake_actions_to_shape_keys.py file, adding an entry in ACTION_MESHES for each new pose added. The entry should be named exactly the same as the new pose, and correspond to an array detailing which meshes the pose should modify.
- Open this updated file in the blender scripting interface and run. You can look at the console logs to confirm its working. -Once finished you might notice in the viewport that the character has changed slightly. THis is normal. -Now run the replace_default_basis.py unchanged in the Blender Scripting interface. This removes the autogenerated Basis and replaces it with the Basis from our pose asset library. Once this script is run the character will look completely different in the viewport. This is what i meant earlier when I said the meshes would be unusable for further modifications. The viewport looks unnatural as its trying to show the Basis shape key as well as its Armature, doubling the difference between BlenRigs unatural rest pose and the rest pose we want.
- Now export your character, test extensively, then update the original folder with the copy made between steps 4 and 5, and the updated bake_actions_to_shape_keys.py script. Export Settings:
*Save as Shape Key may not be available depending on your version. if not available, use 'Apply as Shape Key' and then re-add the modifier
Ginger Girl
The ginger girl character was built for initial demo testing and used all 21 visemes from the viseme set. The character was built from the ground up with purchasing any other mesh, however it is too far from the 2 characters discussed above in terms of quality, and would require too much time to bring it up to their level.
Blond Girl
Blond Girl was a character created using the ReadyPlayerMe character creation studio. It exposes the ARKit Blendshape library of 52 Blend Shapes. A mapping was made to create visemes and actions using those blendshapes, and the character was tested in Meall an Óige during the thesis testing. The character works fine but its asthetics don't match MaO as well as the Lion and Spring characters, so it was not adopted into production. It could still be useful for other applications in the future that desire a more serious asthetic. Evaluation of this character showed mix results in terms of viseme accuracy, leading me to believe the mapping of blendshapes to visemes could do with some more work (likely increasing the values to make the visemes more clear).
Map table
The map table of ARKit blendshapes to GiobGeab Visemes and actions can be found below:
blondGirl: {
visemeMode: 'mix',
visemeMixes: [
{ key: "resting", mix: {} },
{ key: "PBM_S", mix: { browDownLeft: 0.1, browDownRight: 0.1, eyeSquintLeft: 0.1, eyeSquintRight: 0.1, mouthClose: 0.05, mouthRollLower: 0.24, mouthRollUpper: 0.24, mouthUpperUpLeft: 0.24, mouthUpperUpRight: 0.24 } },
{ key: "PBM_B", mix: { browDownLeft: 0.1, browDownRight: 0.1, eyeSquintLeft: 0.1, eyeSquintRight: 0.1, mouthClose: 0.06, mouthFunnel: 0.09, mouthRollLower: 0.24, mouthPucker: 0.45, mouthRollUpper: 0.2, mouthUpperUpLeft: 0.24, mouthUpperUpRight: 0.24 } },
{ key: "FV_S", mix: { mouthPucker: 0.3, mouthShrugUpper: 0.7, mouthDimpleLeft: 0.8, mouthDimpleRight: 0.8, mouthRollLower: 0.24 } },
{ key: "FV_B", mix: { mouthPucker: 0.8, mouthShrugUpper: 0.8, mouthLowerDownLeft: 0.16, mouthLowerDownRight: 0.16, mouthDimpleLeft: 0.8, mouthDimpleRight: 0.8, mouthRollLower: 0.27 } },
{ key: "S", mix: { mouthPressLeft: 0.64, mouthPressRight: 0.64, mouthLowerDownLeft: 0.4, mouthLowerDownRight: 0.4, jawOpen: 0.07 } },
{ key: "SH", mix: { mouthRollUpper: 0.24, mouthFunnel: 0.12, jawOpen: 0.14, tongueOut: 0.32 } },
{ key: "TD_S", mix: { mouthPressLeft: 0.57, mouthPressRight: 0.57, mouthFunnel: 0.1, jawOpen: 0.1 } },
{ key: "TD_B", mix: { mouthPressLeft: 0.4, mouthPressRight: 0.4, mouthFunnel: 0.4, jawOpen: 0.12 } },
{ key: "KG_S", mix: { mouthLowerDownLeft: 0.32, mouthLowerDownRight: 0.32, mouthDimpleLeft: 0.24, mouthDimpleRight: 0.24, mouthFunnel: 0.16, mouthPucker: 0.12, jawOpen: 0.1 } },
{ key: "KG_B", mix: { mouthLowerDownLeft: 0.28, mouthLowerDownRight: 0.28, mouthDimpleLeft: 0.2, mouthDimpleRight: 0.2, mouthFunnel: 0.22, mouthPucker: 0.30, jawOpen: 0.12 } },
{ key: "LSL", mix: { mouthLowerDownLeft: 0.32, mouthLowerDownRight: 0.32, mouthDimpleLeft: 0.24, mouthDimpleRight: 0.24, mouthFunnel: 0.24, mouthPucker: 0.24, jawOpen: 0.09, tongueOut: 0.26 } },
{ key: "LBL", mix: { mouthLowerDownLeft: 0.28, mouthLowerDownRight: 0.28, mouthDimpleLeft: 0.2, mouthDimpleRight: 0.2, mouthFunnel: 0.35, mouthPucker: 0.24, jawOpen: 0.11, tongueOut: 0.26 } },
{ key: "NSL", mix: { mouthLowerDownLeft: 0.32, mouthLowerDownRight: 0.32, mouthDimpleLeft: 0.24, mouthDimpleRight: 0.24, mouthFunnel: 0.24, mouthPucker: 0.24, jawOpen: 0.09, tongueOut: 0.26 } },
{ key: "NBL", mix: { mouthLowerDownLeft: 0.28, mouthLowerDownRight: 0.28, mouthDimpleLeft: 0.2, mouthDimpleRight: 0.2, mouthFunnel: 0.35, mouthPucker: 0.24, jawOpen: 0.11, tongueOut: 0.26 } },
{ key: "VFO", mix: { browInnerUp: 0.075, eyeWideLeft: 0.125, eyeWideRight: 0.125, jawOpen: 0.4 } },
{ key: "VFM", mix: { browInnerUp: 0.05, eyeWideLeft: 0.1, eyeWideRight: 0.1, mouthPressLeft: 0.4, mouthPressRight: 0.4, mouthDimpleLeft: 0.6, mouthDimpleRight: 0.6, jawOpen: 0.21 } },
{ key: "VFC", mix: { mouthPressLeft: 0.48, mouthPressRight: 0.48, mouthDimpleLeft: 0.48, mouthDimpleRight: 0.48, jawOpen: 0.14 } },
{ key: "VBM", mix: { browInnerUp: 0.05, eyeWideLeft: 0.1, eyeWideRight: 0.1, mouthPucker: 0.6, mouthFunnel: 0.2, jawForward: 0.3, jawOpen: 0.14 } },
{ key: "VBC", mix: { mouthFunnel: 0.6 } },
{ key: "VBCU", mix: { mouthPressLeft: 0.48, mouthPressRight: 0.48, mouthDimpleLeft: 0.48, mouthDimpleRight: 0.48, jawOpen: 0.14 } },
],
eyeBlinkKeys: ['eyeBlinkLeft', 'eyeBlinkRight'],
smile: { browInnerUp: 0.2, mouthSmileLeft: 0.4, mouthSmileRight: 0.4, jawOpen: 0.1 },
sad: { browInnerUp: 0.6, mouthFrownLeft: 1, mouthFrownRight: 1 },
eyeKeys: ['eyeBlinkLeft', 'eyeBlinkRight'],
headLeft: ['left_12', 'left_25'],
headRight: ['right_12', 'right_25'],
headForward: ['forward_10'],
},
Compressing Characters
To improve perform and minimise file size all characters should use KTX2 textures and Draco Compression. The system in Meall an Óige is built to decode KTX2. This site provides a handy way to do Draco Compress and convert a GLB's textures to KTX2 in a browser. If the destination app doesn't support KTX2 then you should save textures as webp instead, or failing that as pngs.